Codeシリーズの通知を使わずに、AWS Chatbot経由でCodeシリーズの情報をSlackに連携できるか試してみた
データアナリティクス事業本部の笠原です。
業務でCodeCommitやCodeBuildなどのCodeシリーズを扱うことが多いのですが、例えば以下のケースでSlack等に通知したいことはないでしょうか?
- CodeCommitでプルリクが来たら、通知が来て欲しい
- CodeBuildでビルドが成功 / 失敗したら、通知が来て欲しい
- CodeDeployでデプロイが成功 / 失敗したら、通知が来て欲しい
- CodePipelineでパイプラインのどこかで処理が失敗したら、通知が来て欲しい
Slackへの通知には、AWS Chatbotが便利に使えます。
Codeシリーズには、「Notifications」という最適化された通知サービスが既にあります。
【開発者必見】Codeシリーズに最適化された通知サービスNotificationsがリリースされました! | DevelopersIO
また先日、AWS Chatbot が Amazon EventBridge に対応したことで、様々なAWSサービスと連携できるようになりましたね。
[アップデート] ついに AWS Chatbot が 200を超える Amazon EventBridge イベントに対応しました! | DevelopersIO
EventBridge経由でもCodeシリーズの通知が取得できれば、CodeシリーズのNotificationsを使用せずにできるのではないかと思い、やってみました。
やってみた結果
- Codeシリーズの通知をする場合は、素直にCodeシリーズの「Notifications」を使用しましょう。
- 「Notifications」を使用する場合
- EventBridge ⇒ SNS ⇒ Chatbot経由でSlack通知: できた
- EventBridge ⇒ SNS 経由でメール通知: できた
- 「Notifications」を使用しない場合
- EventBridge ⇒ SNS ⇒ Chatbot経由でSlack通知: できなかった
- EventBridge ⇒ SNS 経由でメール通知: できた
EventBridgeを使用する際の基本的な構成
構成図を示すとこんな感じになります。
今回はCodeCommitからの通知を元に構成していきます。
通知メッセージは、EventBridgeからSNSを経由してChatbotへと流れます。Chatbotからは指定したSlackチャンネルに通知メッセージを表示してみます。
CodeCommitリポジトリの準備
CodeCommitのリポジトリを準備します。今回は cm-kasahara-chatbot-repo
という名前のリポジトリを用意して検証します。
Slackチャンネルの準備
次にChatbotからメッセージが届く先となる、Slackチャンネルを用意します。今回は aws_chatbot_notification
というチャンネル名のプライベートチャンネルを用意しました。
AWS Chatbotの設定
次にAWS Chatbotの設定を行います。まずはAWS Chatbotのホームにて「チャットクライアントの設定」を Slack
にしてクライアンを設定します。
通知先のSlackワークスペースを指定したら、「許可する」をします。
続いてチャンネルの設定を行います。「新しいチャンネルの設定」をクリックします。
チャンネルの設定では以下のように設定しておきます。
- Slackチャンネルは、先ほど作成した
aws_chatbot_notification
チャンネルがプライベートチャンネルなので、プライベート
を選択します。プライベートチャンネルの場合は、追加でチャンネルIDを入力します。
チャンネルIDは、Slackから「リンクをコピー」をすることで、取得できます。なお、チャンネルIDの入力部分には「リンクをコピー」で取得したチャンネルのURL全体を指定してもいいですし、チャンネルURL末尾のID文字列部分だけ指定してもいいです。
- アクセス許可では
テンプレートを使用してIAMロールを作成する
を選択して、新規で作成しました。またポリシーテンプレートでは、通知のアクセス許可
としました。
- SNSでは、今の段階ではとりあえず何も指定しません。必要になったら改めて設定します。
これでチャンネル設定ができました。
SlackチャンネルにAWSアプリを導入する
AWS Chatbotでチャンネル設定できたら、一旦SlackのチャンネルでAWSアプリを導入してあげる必要があります。Slackの左側ペインにAWSアプリが無ければ、Slackのアプリ検索の中からAWSアプリを追加しましょう。
また、対象のチャンネル aws_chatbot_notification
にて /invite @AWS
と送信してプライベートチャンネル内にAWSアプリを招待します。これで、プライベートチャンネルでもAWSアプリが使えるようになります。
実際に通知してみる
CodeシリーズのNotificationsを使ってSlack通知を試す
CodeCommitのリポジトリを選択してから、左側メニューの「設定」画面に遷移しましょう。
リポジトリの設定画面に遷移したら、「通知」タブから「通知ルールの作成」をクリックします。
通知ルールの設定をします。今回はプルリクに関する通知をしてみたいので、プルリクに関するイベントにチェックをつけました。
また、通知先となるターゲットでは、ターゲットタイプで「AWS Chatbot (Slack)」を選択してから、先ほど作成したAWS Chatbotのクライアントを指定します。
「Submit」したら通知ルールの設定は完了です。
では、実際にCodeCommitにてプルリクを実施してみたいと思います。プルリク作成やプルリクマージなどのイベントが発生した際に、Slackにて通知が来ることを確認しましょう。
CodeシリーズのNotificationsを設定すると作成されるもの
ここで、CodeシリーズのNotificationsを設定すると何が作られるのかざっと見ていきます。
1つは、SNSトピックです。Chatbotに対してメッセージ送信する際に使用されます。サブスクリプションにはCodeシリーズのNotificationsで設定したAWS Chatbotのクライアントが自動的に設定されています。
2つ目は、EventBridgeルールです。CodeシリーズのNotificationsのイベントメッセージをSNSトピックに送信するために使用されるようです。
EventBridgeルールのターゲットを見ると、SNSトピックではなく、別のイベントバスになっていました。
CodeシリーズのNotificationsを使わないでSlack通知を試す
今度は、CodeシリーズのNotificationsを使わずにSlack通知できるか試してみます。SlackチャンネルはCodeシリーズのNotificationsとは別のプライベートチャンネルを作成して試してみます。
まずはSNSトピックを作成します。トピック名を指定し、タイプをスタンダードにして他デフォルトのままにしています。
次にAWS Chatbotのクライアントで別のチャンネル設定を追加しておきます。基本的には同じ内容になりますが、通知の「SNSトピック」は、先ほど作成したSNSトピックを指定します。
チャンネル設定を追加すると、先ほど作成したSNSトピックにChatbotのサブスクリプションが追加されているはずです。
SNSとChatbotが連携できると、ChatbotからSlackに対してテストメッセージが送信できますので試してみます。
AWS Chatbotで先ほど設定したチャンネル設定の中に「テストメッセージを送信」をクリックします。設定が正しければ、Slackにテストメッセージが送信されているはずです
Slackにテストメッセージが送信されていない場合は、チャンネルにAWSアプリを招待していない等考えられますので、ご確認ください。
あとは、EventBridgeからCodeCommitのイベントメッセージをSNSトピックに送信するように設定します。
EventBridgeにて「ルール」「ルールの追加」をクリックします。
ルールの作成の際は以下のように設定します。
- イベントパターンは以下の通り
- サービスごとの事前定義パターン
- サービスプロバイダー: AWS
- サービス名: CodeCommit
- イベントタイプ: CodeCommit Pull Request State Change
- 特定リソース (ARN 別)
- CodeCommitリポジトリARNを入力
- イベントパターンテストをする際は、サンプルイベントの
resources
にCodeCommitリポジトリARNを指定してあげると、検証成功になります
- イベントバスはデフォルトで
- ターゲットはSNSトピックとし、作成したSNSトピックを選択
- 入力の設定はデフォルトのまま (一致したイベント)
- 再試行ポリシーとデッドレターキューはデフォルトのまま
これで設定できたので、CodeCommitにてプルリクのイベントを実施して、Slackに通知が送信されるか確認してみましょう。
実際にやってみたところ、私の環境ではSlackへの通知が届きませんでした。権限周りで何か追加設定が必要なのかと思い、AWS公式ドキュメントを色々探してみましたが、結局Slack通知できませんでした。Codeシリーズからの通知は、設定が容易なNotificationsを使用する方法が良さそうです。
各SNSからファンアウトしてメール通知を試す
せっかくなので、Notificationsを使用した際に作成されたSNSトピックと、Notificationsを使用せずにこちらで作成したSNSトピックから、メッセージをメール送信するサブスクリプションを追加してみました。メール通知の場合は、両者ともメッセージが届きました。
まとめ
いかがでしたでしょうか。Codeシリーズのイベント通知をSlackへ送信する際は、CodeシリーズのNotificationsを使用した方が良さそうです。設定も簡単なのでオススメです。
それ以外のイベント通知については、EventBrigde ⇒ SNS ⇒ Chatbotの通知を押さえておくと、様々なAWSリソースの通知に使えますので、ぜひ覚えておきましょう。